package com.munichosica.myapp.controller.Usuario;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.zip.DataFormatException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.munichosica.myapp.dto.FotoJF;
import com.munichosica.myapp.dto.Usuario;
import com.munichosica.myapp.dto.UsuarioJF;
import com.munichosica.myapp.exceptions.PersonaDaoException;
import com.munichosica.myapp.exceptions.RolException;
import com.munichosica.myapp.exceptions.UsuarioException;
import com.munichosica.myapp.factory.UsuarioDaoFactory;
import com.munichosica.myapp.util.FileUtil;

@Controller
@RequestMapping("/Usuario")
public class UsuariosController {
	
	Logger logger=Logger.getLogger(UsuariosController.class);
	
	@RequestMapping(value="Listar.htm", method=RequestMethod.POST)
	public @ResponseBody List<UsuarioJF> listar(@RequestParam("criterio") String criterio,
			@RequestParam("texto") String texto, @RequestParam("estado") String estado){
		logger.info("Ingreso a Mototaxi/Listar.htm");
		List<UsuarioJF> list=null;
		try {
			list=UsuarioDaoFactory.create().listarUsuarios(criterio, texto, estado);
			logger.info("list=UsuarioDaoFactory.create().listarUsuarios(criterio, texto, estado)");
		} catch (UsuarioException e) {
			logger.error(e.getMessage(),e);
		}
		return list;
	}
	
	@RequestMapping(value="Procesar.htm",method=RequestMethod.POST)
	public @ResponseBody String procesar(HttpServletRequest request,UsuarioJF usuarioJF){
		HttpSession session=request.getSession(true);
		Usuario usuario=(Usuario) session.getAttribute("USUARIO");
		FotoJF foto=(FotoJF) session.getAttribute("FOTO_USUARIO");
		try {
			if(foto!=null){
				usuarioJF.setUsufotoB(foto.getFotArchivo());
				usuarioJF.setUsufotoExtV(foto.getFotExtension());
			}
			usuarioJF.setPerusuarioV(usuario.getUsuusuarioV());
			usuarioJF.setPeripV(request.getRemoteAddr());
			
			if(usuarioJF.getUsucodigoI()==null||usuarioJF.getUsucodigoI()==0){
				if(UsuarioDaoFactory.create().existeUsuario(usuarioJF.getUsuusuarioV())){
					throw new UsuarioException("Usuario: "+usuarioJF.getUsuusuarioV()+" ya existe");
				}
			}
			UsuarioDaoFactory.create().procesar(usuarioJF);
			logger.info("UsuarioDaoFactory.create().procesar(usuario); Completed codigo: "+usuarioJF.getUsucodigoI());
		} catch (Exception ex) {
			logger.error(ex.getMessage(),ex);
		}
		return usuarioJF.getUsuusuarioV();
	}
	
	@RequestMapping(value="ExisteUsuario.htm",method=RequestMethod.GET)
	public @ResponseBody boolean existeUsuario(@RequestParam("usuario")String usuario){
		boolean existe=false;
		try {
			existe=UsuarioDaoFactory.create().existeUsuario(usuario);
		} catch (UsuarioException e) {
			logger.error(e.getMessage(),e);
		}
		return existe;
	}
	
	@RequestMapping(value="Obtener.htm",method=RequestMethod.GET)
	public @ResponseBody UsuarioJF obtener(HttpServletRequest request ,@RequestParam("codigo") Integer codigo){
		UsuarioJF usuarioJF=null;
		try {
			usuarioJF=UsuarioDaoFactory.create().obtenerUsuario(request, codigo);
			logger.info("usuarioJF=UsuarioDaoFactory.create().obtenerUsuario(codigo);");
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
		return usuarioJF;
	}
	
	@RequestMapping(value="Eliminar.htm", method=RequestMethod.GET)
	public @ResponseBody List<UsuarioJF> eliminar(@RequestParam("codigo") Integer codigo){
		List<UsuarioJF> list=null;
		logger.info("@RequestMapping(value=Eliminar.htm, method=RequestMethod.GET)");
		try {
			UsuarioDaoFactory.create().eliminar(codigo);
			logger.info("UsuarioDaoFactory.create().eliminar(codigo); Eliminado:"+codigo);
			list=UsuarioDaoFactory.create().listarUsuarios("USU.USUUSUARIO_V", "", "1");
		} catch (UsuarioException e) {
			logger.error(e.getMessage(), e);
		}
		return list;
		//return "redirect:almacenform.html?from=list&id="+id;
	}
	
	@RequestMapping(value="Foto.htm", method=RequestMethod.POST, headers="content-type=multipart/form-data")
	public @ResponseBody String agregarFoto(HttpServletRequest request){
		logger.info("Ingreso a Usuarios/Foto.htm");
		HttpSession session=request.getSession(true);
		FotoJF foto=(FotoJF) session.getAttribute("FOTO_USUARIO");
		if(foto==null){
			foto=new FotoJF();
			session.setAttribute("FOTO_USUARIO", foto);
			logger.info("Se creo session.setAttribute('FOTO_USUARIO', foto);");
		}
		String nombreArchivo="";
		try {
			for(Part part:request.getParts()){
				InputStream inputStream=request.getPart(part.getName()).getInputStream();
				int i=inputStream.available();
				byte[] bs=new byte[i];
				inputStream.read(bs);
				if(part.getName().equals("fileFoto")){
					String filename=FileUtil.getFilename(part);
					foto.setFotNombre(filename);
					foto.setFotArchivo(FileUtil.compress(bs));
					foto.setFotExtension(FileUtil.getExtension(filename));
					nombreArchivo=FileUtil.createTempFile(request, foto.getFotNombre() , bs);
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
		} 
		return nombreArchivo;
	}
}
